//AI生成代码，未测试。20251106
#pragma once
#include "../../common/include/obj.h"

class CBasicPad : public CVirtualDestruct
{ // 基类，填充尽可能少的0使数据达到分组长度的整数倍
public:
    CBasicPad(int iSize = 16) { m_iBlockSize = iSize; };
    virtual ~CBasicPad() {};

    int m_iBlockSize = 16;

    virtual int Pad(BYTE *pData, int &iLen);
    virtual int UnPad(BYTE *pData, int &iLen) { return 0; };
    virtual int Pad(STD_BUFFER &bufData);
    virtual int UnPad(STD_BUFFER &bufData);
};

/*
1、NoPadding
不填充，在此填充下原始数据必须是分组大小的整数倍，非整数倍时无法使用该模式，会报错。


2、Zero Padding
原文不符合分组长度，填充0至满足分组长度，原文符合分组长度增加一个全0的分组。
原始：FF FF FF FF FF FF FF FF FF
填充：FF FF FF FF FF FF FF FF FF 00 00 00 00 00 00 00

应用：
已知数据对齐的场景：如流加密模式（CTR、OFB）中明文长度已确定，无需动态填充。
特定协议要求：如某些物联网设备通信协议为减少计算开销，强制使用零填充，但需配合严格长度校验以避免截断风险。
局限性：因填充后无法自动区分有效数据和填充内容，易导致解密错误或安全漏洞，需谨慎使用。
*/
class CZeroPad : public CBasicPad
{
public:
    CZeroPad(int iSize = 16) { m_iBlockSize = iSize; };
    virtual ~CZeroPad() {};

    virtual int Pad(BYTE *pData, int &iLen);
    virtual int UnPad(BYTE *pData, int &iLen);
};
